import Ice.Current;
import iotosdk.dto.*;
import lombok.extern.slf4j.Slf4j;
import iotosdk.IOTOSysI;
import iotosdk.routellib.CallbackReceiverDisp;
import iotosdk.util.Command;

import java.util.Map;

/**
 * 研发可以根据业务需要，把SDK引入集成到自己的项目里
 */


@Slf4j
public class IOTOSysService {

    /**
     * 必须传入main入口类对象，否则无法获取当前运行目录。
     */
    public static void main(String[] args) throws Exception {
        // 网关ID
        final String gateway_uuid = "b81fd41ce62111ec9705525400ffc252";
        // 上面网关ID的下属设备ID
        final String deviveId = "96e00095";

        // 获取命令行参数，这一步不定需要，可以自行组装登录参数。
        Command command = new Command(IOTOSysService.class, args);
        command.getArgsParser().setUuid(gateway_uuid);
        IOTOSysI iotoSysI = new IOTOSysI(command.runDir);
        LoginDTO webLoginParam = command.getWebLoginParam();


        LoginDTO loginDTO = new LoginDTO("admin", "123456", gateway_uuid, "http://localhost", "证书目录");

        // 连接中台，建立与中台通信连接实例。
        LoginResp loginResp = iotoSysI.login(loginDTO, new CallbackReceiverDisp() {
            public String callback(String fromUuid, String data, Current __current) {
                // 中台数据下发，在这里接收并处理
                log.info("fromUuid:{}, data:{}", fromUuid, data);
                return ResultDTO.code(0).toString();
            }
        });

        // 打印登录结果
        log.info("{}", loginResp);


        // 设置设备上下线状态，研发可根据业务场景需要设备实例的上下线状态。
        ResultDTO resultDTO1 = iotoSysI.devOnline(String.format("%s", deviveId));
        log.info("devOnline:{}", resultDTO1);

        // 获取当前网关信息和设备列表数据
        ResultDTO tableDetail = iotoSysI.getTableDetail();

        // 获取网关信息对象
        IonodeDTO ionodeDTO = tableDetail.getData().toJavaObject(IonodeDTO.class);
        // 取网关配置
        IonodeConfigDTO ionodeConfigDTO = ionodeDTO.getConfig(IonodeConfigDTO.class);

        // 获取设备实例列表
        for (Map.Entry<String, DeviceDTO> entry : ionodeDTO.getProperties().entrySet()) {
            String deviceOid = entry.getKey();
            DeviceDTO deviceDTO = entry.getValue();
            /**
             * 取设备配置信息
             */
            DeviceConfigDTO deviceConfigDTO = deviceDTO.getConfig(DeviceConfigDTO.class);
            for (Map.Entry<String, DataDTO> dataEntry : deviceDTO.getData().entrySet()) {
                String dataOid = dataEntry.getKey();
                DataDTO dataDTO = dataEntry.getValue();
                /**
                 * 取数据点配置信息
                 */
                DataConfigDTO dataConfigDTO = dataDTO.getConfig(DataConfigDTO.class);
            }
        }
        log.info("table:{}", tableDetail.getData().toJSONString());
        HeartbeatDTO heartbeat = iotoSysI.heartbeat();
        log.info("heartbeat:{}", heartbeat);
        int t = 10;
        while (t-- > 0) {
            // 向指定设备数据点上报数据
            DataPubDTO dataPubDTO = new DataPubDTO(String.format("%s.%s.%s", webLoginParam.uuid, deviveId, "32df"), System
                    .currentTimeMillis());
            ResultDTO resultDTO = iotoSysI.pubMsg(dataPubDTO);
            log.info("{}", resultDTO);
            Thread.sleep(500);
        }

        ResultDTO resultDTO = iotoSysI.devOffline(deviveId);
        log.info("devOnline:{}", resultDTO.toString());
        ResultDTO logout = iotoSysI.logout();
        log.info("logout:{}", logout);
        System.exit(0);
    }
}